package com.example.mapper;

import com.example.entity.OperationLog;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 操作日志Mapper接口
 */
@Mapper
public interface OperationLogMapper {
    
    /**
     * 插入操作日志
     */
    int insert(OperationLog operationLog);
    
    /**
     * 根据ID查询操作日志
     */
    OperationLog selectById(Long id);
    
    /**
     * 根据ID删除操作日志
     */
    int deleteById(Long id);
    
    /**
     * 批量删除操作日志
     */
    int deleteByIds(@Param("ids") List<Long> ids);
    
    /**
     * 条件查询操作日志列表
     */
    List<OperationLog> selectList(@Param("operationLog") OperationLog operationLog);
    
    /**
     * 分页查询操作日志
     */
    List<OperationLog> selectPage(@Param("offset") int offset, 
                                  @Param("limit") int limit,
                                  @Param("username") String username,
                                  @Param("module") String module,
                                  @Param("operationType") String operationType,
                                  @Param("status") String status,
                                  @Param("startTime") LocalDateTime startTime,
                                  @Param("endTime") LocalDateTime endTime,
                                  @Param("ipAddress") String ipAddress);
    
    /**
     * 统计操作日志总数
     */
    long selectCount(@Param("username") String username,
                     @Param("module") String module,
                     @Param("operationType") String operationType,
                     @Param("status") String status,
                     @Param("startTime") LocalDateTime startTime,
                     @Param("endTime") LocalDateTime endTime,
                     @Param("ipAddress") String ipAddress);
    
    /**
     * 根据用户ID查询操作日志
     */
    List<OperationLog> selectByUserId(@Param("userId") Long userId, 
                                      @Param("limit") Integer limit);
    
    /**
     * 根据模块查询操作日志
     */
    List<OperationLog> selectByModule(@Param("module") String module, 
                                      @Param("limit") Integer limit);
    
    /**
     * 查询指定时间范围内的操作日志
     */
    List<OperationLog> selectByTimeRange(@Param("startTime") LocalDateTime startTime,
                                         @Param("endTime") LocalDateTime endTime);
    
    /**
     * 查询失败的操作日志
     */
    List<OperationLog> selectFailureLogs(@Param("startTime") LocalDateTime startTime,
                                         @Param("endTime") LocalDateTime endTime,
                                         @Param("limit") Integer limit);
    
    /**
     * 统计各模块操作次数
     */
    List<Map<String, Object>> selectModuleStatistics(@Param("startTime") LocalDateTime startTime,
                                                     @Param("endTime") LocalDateTime endTime);

    /**
     * 统计各操作类型次数
     */
    List<Map<String, Object>> selectOperationTypeStatistics(@Param("startTime") LocalDateTime startTime,
                                                            @Param("endTime") LocalDateTime endTime);
    
    /**
     * 清理指定时间之前的日志
     */
    int deleteBeforeTime(@Param("beforeTime") LocalDateTime beforeTime);
}
